package com.zhu.instructions.math;

import com.zhu.instructions.base.Instruction;
import com.zhu.instructions.base.NoOperandsInstruction;
import com.zhu.rtda.Frame;
import com.zhu.rtda.LocalVars;

import java.nio.ByteBuffer;

/**
 * 指令：iinc
 *
 * 操作数：index (uint8), const (int8)
 *
 * 功能：
 *  将指定索引的局部变量 int 值增加一个常量值
 *
 * 栈变化：无（操作局部变量表，不涉及操作数栈）
 *
 * 示例：
 *  iinc 1, 5 → 将局部变量表索引为 1 的 int 值增加 5
 *
 * 实现：
 *  先读取操作数 index 和 const，然后从局部变量表中获取值，增加常量后写回
 */
public class IINC extends NoOperandsInstruction {
    public int index;     // 局部变量索引
    public int increment; // 增量值

    @Override
    public void fetchOperands(ByteBuffer codeBuffer) {
        this.index = Byte.toUnsignedInt(codeBuffer.get());
        this.increment = codeBuffer.get();
    }

    @Override
    public void execute(Frame frame) {
        LocalVars localVars = frame.getLocalVars();
        int val = localVars.getInt(index);
        val += increment;
        localVars.setInt(index, val);
    }
}
